#!/bin/bash

# ObfuscatorPro 构建脚本
# 用法: ./build.sh [选项]

set -e  # 遇到错误立即退出

# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
cd "$SCRIPT_DIR"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 默认值
BUILD_TYPE="Release"
CLEAN_BUILD=false
RUN_AFTER_BUILD=false
VERBOSE=false
JOBS=$(sysctl -n hw.ncpu 2>/dev/null || echo 4)

# 打印带颜色的消息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

# 显示帮助信息
show_help() {
    cat << EOF
ObfuscatorPro 构建脚本

用法: ./build.sh [选项]

选项:
    -h, --help          显示此帮助信息
    -d, --debug         Debug模式构建
    -r, --release       Release模式构建 (默认)
    -c, --clean         清理后重新构建
    -R, --run           构建完成后运行程序
    -v, --verbose       显示详细输出
    -j, --jobs NUM      并行编译任务数 (默认: $JOBS)

示例:
    ./build.sh                  # Release模式构建
    ./build.sh -d               # Debug模式构建
    ./build.sh -c -R            # 清理构建并运行
    ./build.sh -j 8             # 使用8个并行任务构建
    ./build.sh --cli            # 仅构建命令行版本

EOF
}

# 解析命令行参数
parse_args() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -d|--debug)
                BUILD_TYPE="Debug"
                shift
                ;;
            -r|--release)
                BUILD_TYPE="Release"
                shift
                ;;
            -c|--clean)
                CLEAN_BUILD=true
                shift
                ;;
            -R|--run)
                RUN_AFTER_BUILD=true
                shift
                ;;
            -v|--verbose)
                VERBOSE=true
                shift
                ;;
            -j|--jobs)
                JOBS="$2"
                shift 2
                ;;
            *)
                print_error "未知选项: $1"
                show_help
                exit 1
                ;;
        esac
    done
}

# 检查依赖
check_dependencies() {
    print_info "检查依赖..."
    
    # 检查CMake
    if ! command -v cmake &> /dev/null; then
        print_error "未找到CMake，请先安装CMake"
        exit 1
    fi
    
    # 检查Qt
    if ! command -v qmake &> /dev/null; then
        print_warning "未找到qmake，可能需要设置Qt路径"
    fi
    
    # 检查编译器
    if ! command -v clang++ &> /dev/null && ! command -v g++ &> /dev/null; then
        print_error "未找到C++编译器"
        exit 1
    fi
    
    print_success "依赖检查完成"
}

# 清理构建目录
clean_build() {
    print_info "清理构建目录..."
    if [ -d "${SCRIPT_DIR}/build" ]; then
        rm -rf "${SCRIPT_DIR}/build"/*
        print_success "构建目录已清理"
    fi
}

# 创建构建目录
create_build_dir() {
    if [ ! -d "${SCRIPT_DIR}/build" ]; then
        print_info "创建构建目录..."
        mkdir -p "${SCRIPT_DIR}/build"
    fi
}

# 配置CMake
configure_cmake() {
    print_info "配置CMake (${BUILD_TYPE}模式)..."
    cd "${SCRIPT_DIR}/build"
    
    CMAKE_ARGS="-DCMAKE_BUILD_TYPE=${BUILD_TYPE}"
    
    if [ "$VERBOSE" = true ]; then
        CMAKE_ARGS="${CMAKE_ARGS} -DCMAKE_VERBOSE_MAKEFILE=ON"
    fi
    
    if cmake "${SCRIPT_DIR}" ${CMAKE_ARGS}; then
        print_success "CMake配置成功"
    else
        print_error "CMake配置失败"
        exit 1
    fi
    
    cd "${SCRIPT_DIR}"
}

# 构建项目
build_project() {
    print_info "开始构建 (使用 ${JOBS} 个并行任务)..."
    
    if [ "$VERBOSE" = true ]; then
        cmake --build "${SCRIPT_DIR}/build" -j${JOBS} --verbose
    else
        cmake --build "${SCRIPT_DIR}/build" -j${JOBS}
    fi
    
    if [ $? -eq 0 ]; then
        print_success "构建成功！"
    else
        print_error "构建失败"
        exit 1
    fi
}

# 运行程序
run_program() {
    print_info "启动ObfuscatorPro..."
    
    if [ -f "${SCRIPT_DIR}/build/ObfuscatorPro.app/Contents/MacOS/ObfuscatorPro" ]; then
        "${SCRIPT_DIR}/build/ObfuscatorPro.app/Contents/MacOS/ObfuscatorPro" &
        print_success "程序已启动 (PID: $!)"
    elif [ -f "${SCRIPT_DIR}/build/ObfuscatorPro" ]; then
        "${SCRIPT_DIR}/build/ObfuscatorPro" &
        print_success "程序已启动 (PID: $!)"
    else
        print_error "找不到可执行文件"
        exit 1
    fi
}

# 显示构建信息
show_build_info() {
    echo ""
    echo "=================================="
    echo "    ObfuscatorPro 构建信息"
    echo "=================================="
    echo "构建类型: ${BUILD_TYPE}"
    echo "并行任务: ${JOBS}"
    echo "清理构建: ${CLEAN_BUILD}"
    echo "构建后运行: ${RUN_AFTER_BUILD}"
    echo "=================================="
    echo ""
}

# 主函数
main() {
    # 解析参数
    parse_args "$@"
    
    # 显示构建信息
    show_build_info
    
    # 检查依赖
    check_dependencies
    
    # 清理构建（如果需要）
    if [ "$CLEAN_BUILD" = true ]; then
        clean_build
    fi
    
    # 创建构建目录
    create_build_dir
    
    # 配置CMake
    configure_cmake
    
    # 构建项目
    build_project
    
    # 运行程序（如果需要）
    if [ "$RUN_AFTER_BUILD" = true ]; then
        run_program
    else
        # 如果构建成功且没有指定 -R 选项，询问是否运行
        if [ -f "${SCRIPT_DIR}/build/ObfuscatorPro.app/Contents/MacOS/ObfuscatorPro" ]; then
            echo ""
            print_info "是否运行程序？(y/n)"
            read -r -n 1 response
            echo "" # 换行
            
            if [[ "$response" =~ ^[Yy]$ ]]; then
                run_program
            else
                print_info "跳过运行程序"
            fi
        fi
    fi
    
    print_success "所有操作完成！"
    
    # 显示输出位置
    echo ""
    print_info "可执行文件位置:"
    if [ -f "${SCRIPT_DIR}/build/ObfuscatorPro.app/Contents/MacOS/ObfuscatorPro" ]; then
        echo "  GUI: ${SCRIPT_DIR}/build/ObfuscatorPro.app/Contents/MacOS/ObfuscatorPro"
    fi
}

# 执行主函数
main "$@"